package qdu.edu.com.fushanf4.service.text.search;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import qdu.edu.com.fushanf4.utils.ConfigurationUtil;
import qdu.edu.com.fushanf4.utils.DriverUtil;

import java.io.IOException;

/**
 * 根据用户输入的几个汉字，生成一句话，遍历词语文件生成一句话
 * 第一个路径是单词路径，作切分处理，然后存到HashMap中；第二个路径是实际文件的输出路径
 * 二字词语输入路径：/hadoop/service/count/usertype/search2characters/count/split/sort/output
 * 关键词输入路径：/hadoop/service/text/search/keysInputPath
 * 查询结果输出路径：/hadoop/service/text/search/output
 *
 * 经验：供查询的字典需要先按照开头第一个字排序，在其基础上再按照值排序
 *
 * setup中把词语文件读到一个集合中，最好有哈希值，方便查找，然后在map中搜索\t分隔的几个汉字组成的词语，最终关联起来
 *
 * Map存储键值对<String,ArrayList<String>>，一个词拆成两个字，第一个字作为key，第二个字作为value，存储到数组中，然后就能快速查找。
 * 使用HashMap，预设值为8192，共4467个键，不用再多次扩容
 */
public class TextGenerationByKeysDriver extends DriverUtil {

    /**
     * 根据path[1]指向的文件中几个关键词，得出一个含有这几个关键词的句子
     * @param args 路径：path[0]为二字词语输入路径，path[1]为关键词输入路径，path[2]为查询结果输出路径
     */
    public static void main(String[] args) throws IOException {
        TextGenerationByKeysDriver textGenerationByKeysDriver = new TextGenerationByKeysDriver();
        textGenerationByKeysDriver.run(args);
    }

    /**
     * 根据path[1]指向的文件中几个关键词，得出一个含有这几个关键词的句子
     * @param path 路径：path[0]为二字词语输入路径，path[1]为关键词输入路径，path[2]为查询结果输出路径
     */
    @Override
    public Job runJob(String[] path) throws IOException {
        Job job = ConfigurationUtil.getJob();

        job.getConfiguration().set("keysInputPath", path[1]);

        job.setMapperClass(TextGenerationByKeysMapper.class);
        job.setOutputKeyClass(Text.class);  // 生成的一句话
        job.setOutputValueClass(Text.class);// path[1]的多个关键字

        ConfigurationUtil.setPathAndRunJob(new String[]{path[0], path[2]}, job);

        return job;
    }
}
